package tracing

import (
	"sync"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/trace"
)

// Opts
//
// 这个go函数定义了一个名为Opts的结构体类型，它包含了用于配置跟踪提供和追踪器设置的选项。
// 其中，CustomAttributes字段包含用于默认OpenTelemetry跟踪提供程序的自定义键值对属性。
type Opts struct {
	CustomAttributes []attribute.KeyValue
}

// defaultTracerName is the name for the default tracer that is set up if InitDefaultTracer
const defaultTracerName = "gitee.com/go-caipu-team/go-caipu-plugin-sdk"

var (
	defaultTracer         trace.Tracer
	defaultTracerInitOnce sync.Once
)

// DefaultTracer returns the default tracer that has been set with InitDefaultTracer.
// If InitDefaultTracer has never been called, the returned default tracer is an OTEL tracer
// with its name set to a generic name (`defaultTracerName`)
//
// 该函数返回一个默认的跟踪器，该跟踪器在初始化时通过调用InitDefaultTracer函数进行设置。
// 如果InitDefaultTracer函数从未被调用，返回的默认跟踪器是一个名称为"defaultTracerName"的OTEL跟踪器。
func DefaultTracer() trace.Tracer {
	defaultTracerInitOnce.Do(func() {
		// Use a non-nil default tracer if it's not set, for the first call.
		if defaultTracer == nil {
			defaultTracer = otel.Tracer(defaultTracerName)
		}
	})
	return defaultTracer
}

// InitDefaultTracer sets the default tracer to the specified value.

func InitDefaultTracer(tracer trace.Tracer) {
	defaultTracer = tracer
}
